package main

import (
	"context"
	"fmt"
	"go_stu/5_grpc_stu/7_grpc_auth/protos"
	"net"
	"time"

	"google.golang.org/grpc"
	"google.golang.org/grpc/codes"
	"google.golang.org/grpc/metadata"
	"google.golang.org/grpc/status"
)

type Server struct {
	protos.UnimplementedGreeterServer
}

func (s *Server) SayHello(ctx context.Context, request *protos.HelloRequest) (*protos.HelloReply, error) {

	time.Sleep(time.Second * 2)
	// 返回错误
	// return nil, status.Error(codes.NotFound, "为实现")
	return &protos.HelloReply{
		Message: "hello, " + request.Name,
	}, nil
}

func main() {
	// 创建拦截器的执行方法
	interceptor := func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (resp interface{}, err error) {
		fmt.Println("我接受到一个新请求")
		// 保持原来的执行函数
		res, err := handler(ctx, req)
		// 获取metadata
		md, ok := metadata.FromIncomingContext(ctx)
		if !ok {
			return resp, status.Error(codes.Unauthenticated, "无token认证信息")
		}
		var appid, appkey string
		if v, ok := md["appid"]; ok {
			appid = v[0]
		}
		if v, ok := md["appkey"]; ok {
			appkey = v[0]
		}
		if appid != "10101011" || appkey != "i am key imooc" {
			return resp, status.Error(codes.Unauthenticated, "token认证失败")
		}
		fmt.Println("请求完成")
		return res, err
	}
	// grpc拦截器
	opt := grpc.UnaryInterceptor(interceptor)
	// 实例化服务对象
	g := grpc.NewServer(opt)
	// 注册服务
	protos.RegisterGreeterServer(g, &Server{})
	// 监听端口
	lis, err := net.Listen("tcp", "0.0.0.0:8083")
	if err != nil {
		panic(err.Error())
	}
	// 开启服务
	if err := g.Serve(lis); err != nil {
		panic("start err" + err.Error())
	}
}
